/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.service;

import br.ufc.quixada.adrs.dao.AdministradorDAO;
import br.ufc.quixada.adrs.model.Administrador;
import br.ufc.quixada.adrs.util.Msg;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Caio
 */
public class AdministradorService {

    public static final Comparator<Administrador> comparadorPorDataExclusao = new Comparator<Administrador>() {

        public int compare(Administrador b, Administrador a) {
            if (b.getDataExclusao() == null) {
                return 1;
            }
            if (a.getDataExclusao() == null) {
                return 0;
            }
            return a.getDataExclusao().compareTo(b.getDataExclusao());
        }
    };
    private final AdministradorDAO dao = new AdministradorDAO();

    public boolean insertAdministrador(Administrador administrador) {
        try {
            UtilAdrs.upperCase(administrador);
            dao.insert(administrador);
            return true;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return false;
        }
    }

    public boolean updateAdministrador(Administrador administrador) {
        try {
            UtilAdrs.upperCase(administrador);
            dao.update(administrador);
            return true;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return false;
        }
    }

    public boolean reativarContaAdmin(Administrador administrador) {
        try {
            dao.reativarAdmin(administrador);
            return true;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return false;
        }
    }

    public boolean deleteAdministrador(Long id) {
        try {
            dao.delete(id);
            return true;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return false;
        }
    }

    public Administrador getAdministradorById(Long id) {
        try {
            Administrador administrador = dao.getAdministradorById(id);
            if (administrador == null) {
                return null;
            } else {
                return administrador;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public Administrador getAdministradorByUsuarioId(Long id) {
        try {
            Administrador administrador = dao.getByUsuarioId(id);
            if (administrador == null) {
                return null;
            } else {
                return administrador;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public Administrador getAdministradorByUsuarioIdToAtivarConta(Long id) {
        try {
            Administrador administrador = dao.getByUsuarioIdToAivarConta(id);
            if (administrador == null) {
                return null;
            } else {
                return administrador;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Administrador> getAllAdministradores() {
        try {
            List<Administrador> administrador = dao.getAll();
            if (administrador == null) {
                return null;
            } else {
                return administrador;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Administrador> getAdministradoresExcluidos() {
        try {
            List<Administrador> administradores = dao.getExcluidos();
            if (administradores != null) {
                Collections.sort(administradores, comparadorPorDataExclusao);
            }
            return administradores;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }
}
